package com.flight.model.service.impl;

import com.flight.model.dao.CabinDAO;
import com.flight.model.dao.OrderDAO;
import com.flight.model.dao.impl.CabinDAOImpl;
import com.flight.model.dao.impl.OrderDAOImpl;
import com.flight.model.entity.Cabin;
import com.flight.model.entity.Order;
import com.flight.model.service.BookingService;
import com.flight.util.Constant;
import com.flight.util.DBUtil;
import com.flight.util.DateUtil;
import com.flight.util.StringUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;

/**
 * 订票服务实现类（核心业务逻辑）
 */
public class BookingServiceImpl implements BookingService {
    private OrderDAO orderDAO = new OrderDAOImpl();
    private CabinDAO cabinDAO = new CabinDAOImpl();

    @Override
    public String createOrder(String passengerId, Integer cabinId, String orderMethod) {
        // 1. 修复：直接通过舱位ID查询单个舱位（原逻辑查询条件错误）
        Cabin targetCabin = getCabinById(cabinId);
        if (targetCabin == null) {
            return null; // 舱位不存在
        }

        // 2. 检查余票
        if (targetCabin.getRemainingSeats() < 1) {
            return null; // 无余票
        }

        // 3. 扣减舱位余票
        if (!cabinDAO.reduceRemainingSeats(cabinId)) {
            return null; // 扣减失败
        }

        // 4. 创建订单
        Order order = new Order();
        order.setOrderId(StringUtil.generateOrderId()); // 生成随机订单号
        order.setPassengerId(passengerId);
        order.setCabinId(cabinId);
        order.setOrderMethod(orderMethod);
        order.setOrderAmount(targetCabin.getCabinPrice()); // 订单金额=舱位价格
        order.setPayStatus(Constant.ORDER_STATUS_UNPAID); // 初始状态：未付款
        order.setOrderTime(new Date());

        if (orderDAO.createOrder(order)) {
            return order.getOrderId(); // 返回订单号
        } else {
            // 订单创建失败，回滚余票
            cabinDAO.increaseRemainingSeats(cabinId);
            return null;
        }
    }

    // 新增：通过舱位ID查询舱位信息的方法
    private Cabin getCabinById(Integer cabinId) {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            conn = DBUtil.getConnection();
            String sql = "SELECT * FROM cabin WHERE cabin_id = ?";
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, cabinId);
            rs = stmt.executeQuery();

            if (rs.next()) {
                Cabin cabin = new Cabin();
                cabin.setCabinId(rs.getInt("cabin_id"));
                cabin.setFlightNo(rs.getString("flight_no"));
                cabin.setCabinType(rs.getString("cabin_type"));
                cabin.setCabinPrice(rs.getDouble("cabin_price"));
                cabin.setTotalSeats(rs.getInt("total_seats"));
                cabin.setRemainingSeats(rs.getInt("remaining_seats"));
                return cabin;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, stmt, rs);
        }
        return null;
    }

    @Override
    public boolean payOrder(String orderId) {
        // 1. 查询订单
        Order order = orderDAO.getByOrderId(orderId);
        if (order == null) {
            return false; // 订单不存在
        }

        // 2. 验证状态（只能支付未付款订单）
        if (order.getPayStatus() != Constant.ORDER_STATUS_UNPAID) {
            return false;
        }

        // 3. 更新支付状态
        return orderDAO.updatePayStatus(orderId, Constant.ORDER_STATUS_PAID);
    }

    @Override
    public boolean refundOrder(String orderId) {
        // 1. 查询订单
        Order order = orderDAO.getByOrderId(orderId);
        if (order == null) {
            return false; // 订单不存在
        }

        // 2. 验证状态（只能退已付款订单）
        if (order.getPayStatus() != Constant.ORDER_STATUS_PAID) {
            return false;
        }

        // 3. 计算退票手续费（假设20%）
        double refundFee = order.getOrderAmount() * 0.2;

        // 4. 增加舱位余票
        if (!cabinDAO.increaseRemainingSeats(order.getCabinId())) {
            return false; // 余票更新失败
        }

        // 5. 更新订单退票信息
        return orderDAO.updateRefundInfo(orderId, refundFee, DateUtil.formatTime(new Date()));
    }

    @Override
    public List<Order> getOrdersByPassengerId(String passengerId) {
        return orderDAO.getByPassengerId(passengerId);
    }
}

//package com.flight.model.service.impl;
//
//import com.flight.model.dao.CabinDAO;
//import com.flight.model.dao.OrderDAO;
//import com.flight.model.dao.impl.CabinDAOImpl;
//import com.flight.model.dao.impl.OrderDAOImpl;
//import com.flight.model.entity.Cabin;
//import com.flight.model.entity.Order;
//import com.flight.model.service.BookingService;
//import com.flight.util.Constant;
//import com.flight.util.DateUtil;
//import com.flight.util.StringUtil;
//import java.util.Date;
//import java.util.List;
//
///**
// * 订票服务实现类（核心业务逻辑）
// */
//public class BookingServiceImpl implements BookingService {
//    private OrderDAO orderDAO = new OrderDAOImpl();
//    private CabinDAO cabinDAO = new CabinDAOImpl();
//
//    @Override
//    public String createOrder(String passengerId, Integer cabinId, String orderMethod) {
//        // 1. 查询舱位信息（验证舱位是否存在+获取价格）
//        List<Cabin> cabins = cabinDAO.getByFlightNo(""); // 实际应先查舱位所属航班，简化处理
//        Cabin targetCabin = cabins.stream()
//                .filter(c -> c.getCabinId().equals(cabinId))
//                .findFirst()
//                .orElse(null);
//        if (targetCabin == null) {
//            return null; // 舱位不存在
//        }
//
//        // 2. 检查余票
//        if (targetCabin.getRemainingSeats() < 1) {
//            return null; // 无余票
//        }
//
//        // 3. 扣减舱位余票
//        if (!cabinDAO.reduceRemainingSeats(cabinId)) {
//            return null; // 扣减失败
//        }
//
//        // 4. 创建订单
//        Order order = new Order();
//        order.setOrderId(StringUtil.generateOrderId()); // 生成随机订单号
//        order.setPassengerId(passengerId);
//        order.setCabinId(cabinId);
//        order.setOrderMethod(orderMethod);
//        order.setOrderAmount(targetCabin.getCabinPrice()); // 订单金额=舱位价格
//        order.setPayStatus(Constant.ORDER_STATUS_UNPAID); // 初始状态：未付款
//        order.setOrderTime(new Date());
//
//        if (orderDAO.createOrder(order)) {
//            return order.getOrderId(); // 返回订单号
//        } else {
//            // 订单创建失败，回滚余票
//            cabinDAO.increaseRemainingSeats(cabinId);
//            return null;
//        }
//    }
//
//    @Override
//    public boolean payOrder(String orderId) {
//        // 1. 查询订单
//        Order order = orderDAO.getByOrderId(orderId);
//        if (order == null) {
//            return false; // 订单不存在
//        }
//
//        // 2. 验证状态（只能支付未付款订单）
//        if (order.getPayStatus() != Constant.ORDER_STATUS_UNPAID) {
//            return false;
//        }
//
//        // 3. 更新支付状态
//        return orderDAO.updatePayStatus(orderId, Constant.ORDER_STATUS_PAID);
//    }
//
//    @Override
//    public boolean refundOrder(String orderId) {
//        // 1. 查询订单
//        Order order = orderDAO.getByOrderId(orderId);
//        if (order == null) {
//            return false; // 订单不存在
//        }
//
//        // 2. 验证状态（只能退已付款订单）
//        if (order.getPayStatus() != Constant.ORDER_STATUS_PAID) {
//            return false;
//        }
//
//        // 3. 计算退票手续费（假设20%）
//        double refundFee = order.getOrderAmount() * 0.2;
//
//        // 4. 增加舱位余票
//        if (!cabinDAO.increaseRemainingSeats(order.getCabinId())) {
//            return false; // 余票更新失败
//        }
//
//        // 5. 更新订单退票信息
//        return orderDAO.updateRefundInfo(orderId, refundFee, DateUtil.formatTime(new Date()));
//    }
//
//    @Override
//    public List<Order> getOrdersByPassengerId(String passengerId) {
//        return orderDAO.getByPassengerId(passengerId);
//    }
//}